package com.atguigu.activity;

import org.activiti.engine.HistoryService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.task.Task;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

/**
 * Candidate-users候选人
 *
 * 在流程定义中在任务结点的assignee固定设置任务负责人，在流程定义时将参与者固定设置在.bpmn文件中，
 * 如果要临时变更任务负责人则需要修改流程定义，系统扩展性很差，针对这种情况，
 * 我们可以给任务设置多个候选人，从候选人中选择参与者来完成任务
 */
@SpringBootTest
public class ActivityTest3 {
    @Autowired
    private RepositoryService repositoryService;
    @Autowired
    private RuntimeService runtimeService;
    @Autowired
    private TaskService taskService;
    @Autowired
    private HistoryService historyService;
    /**
     *
     * @author lyj
     * @date 2024-01-14
     * 流程定义部署以及启动
     */
    @Test
    public void deployProcess(){
      /*  Deployment deploy = repositoryService.createDeployment().addClasspathResource("process/qingjia4.bpmn20.xml").name("请假申请流程").deploy();
        System.out.println(deploy.getId());
        System.out.println(deploy.getName());*/
        runtimeService.startProcessInstanceByKey("qingjia4");
    }

    /**
     * 查询组任务
     */
    @Test
    public void findGroupTaskList() {
        List<Task> zhangsan01 = taskService.createTaskQuery().taskCandidateUser("zhangsan02").list();
        for (Task task : zhangsan01) {
            System.out.println("----------------------------");
            System.out.println("流程实例id：" + task.getProcessInstanceId());
            System.out.println("任务id：" + task.getId());
            System.out.println("任务负责人：" + task.getAssignee());
            System.out.println("任务名称：" + task.getName());
        }
    }
    @Test
    public void claimTask(){
        //拾取任务,即使该用户不是候选人也能拾取(建议拾取时校验是否有资格)
        //校验该用户有没有拾取任务的资格
        Task zhangsan01 = taskService.createTaskQuery().taskCandidateUser("lisi01").singleResult();
        if (zhangsan01!=null){
            taskService.claim(zhangsan01.getId(),"lisi01");
            System.out.println("任务拾取成功");
        }
    }

    /**
     * 查询个人待办任务
     *
     * 查询方式同个人任务查询
     */
    @Test
    public void findGroupPendingTaskList() {
        //任务负责人
        String assignee = "lisi01";
        List<Task> list = taskService.createTaskQuery()
                .taskAssignee(assignee)//只查询该任务负责人的任务
                .list();
        for (Task task : list) {
            System.out.println("流程实例id：" + task.getProcessInstanceId());
            System.out.println("任务id：" + task.getId());
            System.out.println("任务负责人：" + task.getAssignee());
            System.out.println("任务名称：" + task.getName());
        }
    }

    /**
     * 办理个人任务
     *
     * 同个人任务办理
     */
    @Test
    public void completGroupTask() {
        Task task = taskService.createTaskQuery()
                .taskAssignee("lisi01")  //要查询的负责人
                .singleResult();//返回一条
        taskService.complete(task.getId());
    }

    /**
     * 归还组任务
     *
     * 如果个人不想办理该组任务，可以归还组任务，归还后该用户不再是该任务的负责人
     */
    @Test
    public void assigneeToGroupTask() {
        String taskId = "d96c3f28-825e-11ed-95b4-7c57581a7819";
        // 任务负责人
        String userId = "zhangsan01";
        // 校验userId是否是taskId的负责人，如果是负责人才可以归还组任务
        Task task = taskService
                .createTaskQuery()
                .taskId(taskId)
                .taskAssignee(userId)
                .singleResult();
        if (task != null) {
            // 如果设置为null，归还组任务,该 任务没有负责人
            taskService.setAssignee(taskId, null);
        }
    }

    /**
     * 任务交接
     *
     * 任务交接，任务负责人将任务交给其它候选人办理该任务
     */
    @Test
    public void assigneeToCandidateUser() {
        // 当前待办任务
        String taskId = "d96c3f28-825e-11ed-95b4-7c57581a7819";
        // 校验zhangsan01是否是taskId的负责人，如果是负责人才可以归还组任务
        Task task = taskService
                .createTaskQuery()
                .taskId(taskId)
                .taskAssignee("zhangsan01")
                .singleResult();
        if (task != null) {
            // 将此任务交给其它候选人zhangsan02办理该 任务
            taskService.setAssignee(taskId, "zhangsan02");
        }
    }
}
